/**
 * Session관련 공통모듈
 * 
 * @author KJH
 * @version 1.0, 2012-02-28
 * @fix([수정자]) [yyyy-mm-dd]: [수정 내용]
 *
 */

/**
 * 함수 리스트
 * 
 * addSession : 세션을 추가한다.
 * deleteSession : 세션을 삭제한다.
 * isUserSession : 올바른 세션인지 판단
 * isAdminSession : 관리자의 올바른 세션인지 판단
 * setSessionValue : 특정 session의 정보변경
 * getSessionMonitor : 세션모니터를 출력
 *
 */

package com.ubst.smartad.session;

import java.util.Hashtable;
import javax.servlet.http.HttpSession;

public class SessionChecker{

	private static Hashtable sessionMonitor;

	/**
	 * 사용자의 세션을 추가한다.
	 * 
	 * @param userid : 세션을 추가할 사용자
	 * @param session : 추가할 세션
	 * @return 
	 *
	*/
	public static void addSession( String userid, HttpSession session ) {
		if( sessionMonitor == null ) {
			sessionMonitor = new Hashtable();
			sessionMonitor.put( userid, session );
		}else if( sessionMonitor.containsKey( userid ) ) {
			sessionMonitor.remove( userid );
			sessionMonitor.put( userid, session );
		}else{
			sessionMonitor.put( userid, session );
		}
	}

	/**
	 * 사용자의 세션을 삭제한다.
	 * 
	 * @param userid : 세션을 삭제할 사용자
	 * @return 
	 *
	*/
	public static void deleteSession( String userid ) {
		if( sessionMonitor != null && sessionMonitor.containsKey( userid ) ){
			sessionMonitor.remove( userid );
		}
	}

	/**
	 * 올바른 세션인지 검사
	 * 
	 * @param session : 검사할 세션
	 * @return 검사결과
	 *
	*/
	public static boolean isUserSession( HttpSession session, String connect_ip ) {
		try {
			if( session == null || sessionMonitor == null ){
				return false;
			}
			String s_userid = (String)session.getAttribute( "INVALIDID" );
			String invalidLicense = (String)session.getAttribute("INVALIDLICENSE");
			String s_connect_ip = (String)session.getAttribute( "INVALIDIP" );
			HttpSession monitorSession = (HttpSession)sessionMonitor.get( s_userid );
			if( monitorSession != null && monitorSession.getId().equals( session.getId() ) && invalidLicense.equals("TRUE") && s_connect_ip.equals(connect_ip) ){
				return true;
			}else{
				return false;
			}
		} catch ( NullPointerException e ) {
			return false;
		}
	}

	/**
	 * 관리자의 올바른 세션인지 검사
	 * 
	 * @param session : 검사할 세션
	 * @return 검사결과
	 *
	*/
	public static boolean isAdminSession( HttpSession session, String connect_ip, int admin_level ) {
		try {
			if( session == null || sessionMonitor == null ){
				return false;
			}
			
			String s_userid = (String)session.getAttribute( "INVALIDID" );
			String invalidLicense = (String)session.getAttribute("INVALIDLICENSE");
			String s_connect_ip = (String)session.getAttribute( "INVALIDIP" );
			int user_level = 10;
			if ( session.getAttribute("USER_LEVEL") != null ) {
				String str_user_level = (String)session.getAttribute("USER_LEVEL");
                if(str_user_level!=null && !str_user_level.equals("")){
                        user_level = Integer.parseInt(str_user_level) ;
                }
			}
			HttpSession monitorSession = (HttpSession)sessionMonitor.get( s_userid );
			if( monitorSession != null && monitorSession.getId().equals( session.getId() ) && invalidLicense.equals("TRUE") && s_connect_ip.equals(connect_ip)
				&& user_level>=admin_level
				&& ((Boolean)monitorSession.getAttribute( "ISADMIN" )).booleanValue() ){
				return true;
			}else{
				return false;
			}
		} catch ( NullPointerException e ) {
			return false;
		}
	}

	/**
	 * 세션모니터의 특정 session의 정보를 바꾸고자 할때 사용
	 *
	 * @param userid : 메일을 받을 사용자( e-mail 형식)
	 * @param key : 세션에 추가할 key
	 * @param value : 세션에 추가할 값
	 * @return 
	 *
	 */
	public static void setSessionValue( String userid, String key, String value ) {
		if( sessionMonitor.containsKey( userid ) ) {
			HttpSession session = (HttpSession)sessionMonitor.get( userid );
			session.setAttribute( key, value );
			sessionMonitor.remove( userid );
			sessionMonitor.put( userid, session );
		}
	}

	/**
	 * 세션모니터를 돌려준다.
	 *
	 * @return 세션모니터
	 *
	 */
	public static Hashtable getSessionMonitor() {
		return sessionMonitor;
	}

}
